import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Created by L.jp
 * Description:
 * 题目描述：
 *  * 有一棵 n 个节点的树，树上每个点都有红绿蓝三种颜色中的一种。定义一棵树是多彩的，当且仅当这棵树同时存在一个红色节点，一个蓝色节点和一个绿色节点。
 *  * 保证最初这棵树是多彩的，现在要砍掉这棵树的某一条边，请问有多少种砍法，使得砍完之后形成的两棵树都是多彩的。
 *  * 输入描述
 *  * 第一行一个整数 n，表示节点个数。
 *  * 第二行 n-1 个整数 p2, p3, ..., pn，pi 表示树上 i 和 pi 两点之间有一条边。保证给出的一定是一棵树。
 *  * 第三行一个长度为 n 的字符串，第 i 个字符表示第 i 个节点的初始颜色。其中 R 表示红色，G 表示绿色，B 表示蓝色。保证字符串只由这三种大写字母构成。
 *  * 对于全部数据，3≤n≤105。
 *  * 输出描述
 *  * 输出一行，一个正整数，表示答案。
 *  * 样例输入
 *  * 7
 *  * 1 2 3 1 5 5
 *  * GBGRRBB
 *  * 样例输出
 *  * 1
 * User: 86189
 * Date: 2023-04-11
 * Time: 0:05
 */
public class Main {
    static int tot;
    static List<Integer>[] G = new ArrayList[100005];
    static char[] color = new char[100005];
    static Edge[] edge = new Edge[100005];
    static int[] szR = new int[100005], szG = new int[100005], szB = new int[100005];
    
    static class Edge {
        int u, v;
        
        Edge(int u, int v) {
            this.u = u;
            this.v = v;
        }
    }
    
    static void dfs(int u, int par) {
        szR[u] = color[u] == 'R' ? 1 : 0;
        szG[u] = color[u] == 'G' ? 1 : 0;
        szB[u] = color[u] == 'B' ? 1 : 0;
        for (int v : G[u]) {
            if (v == par) {
                continue;
            }
            dfs(v, u);
            szR[u] += szR[v];
            szG[u] += szG[v];
            szB[u] += szB[v];
        }
    }
    
    static void solve(int cas) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            G[i] = new ArrayList<Integer>();
        }
        for (int i = 2; i <= n; i++) {
            int fa = sc.nextInt();
            ++tot;
            edge[tot] = new Edge(i, fa);
            G[i].add(fa);
            G[fa].add(i);
        }
        String s = sc.next();
        s = ' ' + s;
        int R = 0, G = 0, B = 0;
        for (int i = 1; i <= n; i++) {
            color[i] = s.charAt(i);
            R += color[i] == 'R' ? 1 : 0;
            G += color[i] == 'G' ? 1 : 0;
            B += color[i] == 'B' ? 1 : 0;
        }
        dfs(1, 0);
        int ans = 0;
        for (int i = 1; i <= tot; i++) {
            int u = edge[i].u, v = edge[i].v;
            if (szR[u] > 0 && szG[u] > 0 && szB[u] > 0) {
                if (R - szR[u] > 0 && G - szG[u] > 0 && B - szB[u] > 0) {
                    ++ans;
                }
            }
        }
        System.out.println(ans);
    }
    
    public static void main(String[] args) {
        int T = 1;
        //Scanner sc = new Scanner(System.in);
        //int T = sc.nextInt();
        while (T-- > 0) {
            solve(T);
        }
    }
}
